package cc.sunni.admin.controller;

import cc.sunni.admin.service.CategoryService;
import cc.sunni.api.BaseController;
import cc.sunni.api.controller.admin.CategoryMngControllerApi;
import cc.sunni.common.Constant;
import cc.sunni.common.utils.R;
import cc.sunni.common.utils.ResultEnum;
import cc.sunni.pojo.Category;
import cc.sunni.pojo.bo.SaveCategoryBO;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class CategoryMngController extends BaseController implements CategoryMngControllerApi {
    @Autowired
    private CategoryService categoryService;

    @Override
    public R saveOrUpdateCategory(@Validated SaveCategoryBO saveCategoryBO) {
        Category newCat = new Category();
        BeanUtils.copyProperties(saveCategoryBO, newCat);
        // id为空新增，不为空修改
        if (saveCategoryBO.getId() == null) {
            // 查询新增的分类名称不能重复存在
            boolean isExist = categoryService.queryCatIsExist(newCat.getName(), null);
            if (!isExist) {
                // 新增到数据库
                categoryService.createCategory(newCat);
            } else {
                return R.en(ResultEnum.CATEGORY_EXIST_ERROR);
            }
        } else {
            // 查询修改的分类名称不能重复存在
            boolean isExist = categoryService.queryCatIsExist(newCat.getName(), saveCategoryBO.getOldName());
            if (!isExist) {
                // 修改到数据库
                categoryService.modifyCategory(newCat);
            } else {
                return R.en(ResultEnum.CATEGORY_EXIST_ERROR);
            }
        }
        return R.ok();
    }

    @Override
    public R getCatList() {
        List<Category> categoryList = categoryService.queryCategoryList();
        return R.ok(categoryList);
    }

    @Override
    public R getCats() {
        // 先从redis中查询，如果有，则返回，如果没有，则查询数据库库后先放缓存，放返回
        String allCatJson = redis.get(Constant.REDIS_ALL_CATEGORY);
        List<Category> categoryList;
        if (StringUtils.isBlank(allCatJson)) {
            categoryList = categoryService.queryCategoryList();
            redis.set(Constant.REDIS_ALL_CATEGORY, JSONUtil.toJsonStr(categoryList), Constant.COOKIE_MONTH);
        } else {
            categoryList = JSONUtil.toList(allCatJson, Category.class);
        }
        return R.ok(categoryList);
    }
}
